/*
* Copyright (c) 2016 ShopJsp. All Rights Reserved.
 * ============================================================================
 * 版权所有 2011 - 今 北京华宇盈通科技有限公司，并保留所有权利。
 * ----------------------------------------------------------------------------
 * 提示：在未取得SHOPJSP商业授权之前，您不能将本软件应用于商业用途，否则SHOPJSP将保留追究的权力。
 * ----------------------------------------------------------------------------
 * 官方网站：http://www.shopjsp.com
 * ============================================================================
*/
package com.hyyt.shopjsp.util.alipay.config;
import com.hyyt.shopjsp.order.pojo.ShopOrders;
import com.hyyt.shopjsp.util.alipay.util.AlipaySubmit;
import com.hyyt.shopjsp.util.common.Utils;
import com.hyyt.shopjsp.util.http.WebUtil;
import com.hyyt.shopjsp.util.redis.util.RedisDataReadUtil;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 支付宝支付接口封装类
 */
public class AlipayUtils {
	/**
	 * 订单支付调用支付宝接口
	 * @param out_trade_no 商户订单号,商户网站订单系统中唯一订单号
	 * @param body 订单描述,存放子订单号集合
	 * @param ordersList 支付的订单集合
	 * @param request
	 * @param response
     * @throws Exception
     */
	public static void gotoOrderAlipay(String out_trade_no,String body,List<ShopOrders> ordersList,HttpServletRequest request,HttpServletResponse response) throws Exception{
		//取得本网站地址
		String basePath = WebUtil.getDomainUrl(request);
		//支付类型,必填，不能修改
		String payment_type = "1";
		//支付宝，合作身份者ID，以2088开头由16位纯数字组成的字符串
		String alipayPartner = RedisDataReadUtil.getSysConfig("alipay_app_partner");
		// 收款支付宝账号，以2088开头由16位纯数字组成的字符串，一般情况下收款账号就是签约账号
		String seller_id = alipayPartner;
		//支付宝接，口名称
		String alipayService = "create_direct_pay_by_user";
		//支付宝，字符编码格式 目前支持 gbk 或 utf-8
		String alipayInputCharset = RedisDataReadUtil.getSysConfig("alipay_app_input_charset");
		//服务器异步通知页面路径,需http://格式的完整路径，不能加?id=123这类自定义参数
		String notify_url = basePath+"alipay/notify.sjson";//回调地址

		//页面跳转同步通知页面路径,需http://格式的完整路径，不能加?id=123这类自定义参数，不能写成http://localhost/
		String return_url = basePath+"order/pay/toPaySuccessAlipay.sjson";//回调地址

		//卖家支付宝帐户,必填
		String seller_email = RedisDataReadUtil.getSysConfig("alipay_app_seller_id");
        /*List<BasicKeybook> seller_emailList = RedisDataReadUtil.getBasicKeyBook("alipayEmail");
        if(seller_emailList!=null&&seller_emailList.size()!=0){
            seller_email = seller_emailList.get(0).getValue();
        }*/

		//商户订单号,商户网站订单系统中唯一订单号，必填
		/*String out_trade_no = new String(WIDout_trade_no.getBytes("ISO-8859-1"),"UTF-8");
		//订单描述,存放子订单号集合
		String body = new String(WIDbody.getBytes("ISO-8859-1"),"UTF-8");*/

		//订单名称,必填
		String subject = "您从SHOPJSP购买商品,订单号为："+out_trade_no;
		//订单集合
		/*List<ShopOrders> ordersList=null;
		//查询订单，未付款，总订单号，子订单号集合
		ordersList = iShopOrdersService.queryShopOrderByAlipay(out_trade_no,body);*/
		BigDecimal finalPrice = new BigDecimal(0);
		if(ordersList!=null&&ordersList.size()>0){
			finalPrice = new BigDecimal(0);
			for(ShopOrders o : ordersList){
				finalPrice = finalPrice.add(o.getFinalAmount());//支付金额
			}
		}
		//保留两位小数
		finalPrice = finalPrice.setScale(2, BigDecimal.ROUND_HALF_UP);
		//付款金额,必填
		String price = finalPrice.toString();

		//商品数量,必填，建议默认为1，不改变值，把一次交易看成是一次下订单而非购买一件商品
		String quantity = "1";

		//物流费用,必填，即运费
		String logistics_fee = "0.00";

		//物流类型,必填，三个值可选：EXPRESS（快递）、POST（平邮）、EMS（EMS）
		String logistics_type = "EXPRESS";

		//物流支付方式,必填，两个值可选：SELLER_PAY（卖家承担运费）、BUYER_PAY（买家承担运费）
		String logistics_payment = "SELLER_PAY";
		//签名类型
		String sign_type = RedisDataReadUtil.getSysConfig("alipay_app_sign_type");

		//商品展示地址,需以http://开头的完整路径，如：http://www.xxx.com/myorder.html
		//String show_url = new String(request.getParameter("WIDshow_url").getBytes("ISO-8859-1"),"UTF-8");
		//收货人姓名,如：张三
		String receive_name = "";
		//收货人地址,XX省XXX市XXX区XXX路XXX小区XXX栋XXX单元XXX号
		String receive_address = "";
		//收货人邮编,如：123456
		String receive_zip = "";
		//收货人电话号码,0571-88158090
		String receive_phone = "";
		//收货人手机号码,如：13312341234
		String receive_mobile = "";
		Integer payMode = null;
		String bankCode = "";
		if(Utils.objectIsNotEmpty(ordersList)&&ordersList.size()>0){
			ShopOrders orders = ordersList.get(0);
			if(Utils.objectIsNotEmpty(orders.getConsignee())){
				receive_name = orders.getConsignee();
			}
			if(Utils.objectIsNotEmpty(orders.getAddress())){
				receive_address = orders.getAddress();
			}
			if(Utils.objectIsNotEmpty(orders.getPostcode())){
				receive_zip = orders.getPostcode();
			}
			if(Utils.objectIsNotEmpty(orders.getPhone())){
				receive_phone = orders.getPhone();
			}
			if(Utils.objectIsNotEmpty(orders.getMobilePhone())){
				receive_mobile = orders.getMobilePhone();
			}
			if(Utils.objectIsNotEmpty(orders.getPayMode())){
				payMode = orders.getPayMode();
			}
			if(Utils.objectIsNotEmpty(orders.getBankCode())){
				bankCode = orders.getBankCode();
			}
		}
		//把请求参数打包成数组
		Map<String, String> sParaTemp = new HashMap<String, String>();
		sParaTemp.put("service", alipayService);//trade_create_by_buyer标准双接口  create_partner_trade_by_buyer担保交易
		sParaTemp.put("partner", alipayPartner);//支付宝，合作身份者ID
		sParaTemp.put("seller_id", seller_id);//收款支付宝账号
		sParaTemp.put("_input_charset", alipayInputCharset);//支付宝，字符编码格式 目前支持 gbk 或 utf-8
		sParaTemp.put("payment_type", payment_type);//支付类型
		sParaTemp.put("notify_url", notify_url);//服务器异步通知页面路径
		sParaTemp.put("return_url", return_url);//页面跳转同步通知页面路径
		sParaTemp.put("seller_email", seller_email);//卖家支付宝帐户,必填
		sParaTemp.put("out_trade_no", out_trade_no);//商户订单号,商户网站订单系统中唯一订单号，必填
		sParaTemp.put("subject", subject);//商品名称
		sParaTemp.put("price", price);//付款金额,必填
		sParaTemp.put("quantity", quantity);//商品数量
		sParaTemp.put("logistics_fee", logistics_fee);//物流费用
		sParaTemp.put("logistics_type", logistics_type);//物流类型
		sParaTemp.put("logistics_payment", logistics_payment);//物流支付方式
		sParaTemp.put("body", body);//订单描述,存放子订单号集合
		sParaTemp.put("sign_type",sign_type) ;//签名类型
        /*sParaTemp.put("anti_phishing_key", AlipaySubmit.query_timestamp());
        sParaTemp.put("exter_invoke_ip", AlipayConfig.exter_invoke_ip);*/
		if(payMode != null){
			if(payMode == 4){
				sParaTemp.put("paymethod","bankPay");
				sParaTemp.put("defaultbank", bankCode);
			}
		}
		//sParaTemp.put("show_url", show_url);
		if(Utils.objectIsNotEmpty(receive_name)){
			sParaTemp.put("receive_name", receive_name);//收货人姓名
		}
		if(Utils.objectIsNotEmpty(receive_address)){
			sParaTemp.put("receive_address", receive_address);//收货人地址
		}
		if(Utils.objectIsNotEmpty(receive_zip)){
			sParaTemp.put("receive_zip", receive_zip);//收货人邮编
		}
		if(Utils.objectIsNotEmpty(receive_phone)){
			sParaTemp.put("receive_phone", receive_phone);//收货人电话
		}
		if(Utils.objectIsNotEmpty(receive_mobile)){
			sParaTemp.put("receive_mobile", receive_mobile);//收货人手机号
		}
		//建立请求
		String sHtmlText = AlipaySubmit.buildRequest(sParaTemp,"get","确认");

/********************以下是将请求数据发向支付宝***********************/
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out;
		out = response.getWriter();
		if(Utils.objectIsNotEmpty(out_trade_no)&&Utils.objectIsNotEmpty(body)){
			out.write(String.valueOf(sHtmlText));
		}else{
			out.write("支付失败！");
		}
		out.flush();
		out.close();
	}


	/**
	 * 用户充值调用支付宝接口
	 * @param out_trade_no
	 * @param body
	 * @param finalPrice
	 * @param payMode
	 * @param bankCode
	 * @param receive_mobile
	 * @param request
	 * @param response
     * @throws Exception
     */
	public static void gotoRechargeAlipay(String out_trade_no,String body,BigDecimal finalPrice,Integer payMode,String bankCode,String receive_mobile,HttpServletRequest request,HttpServletResponse response) throws Exception{
		//取得本网站地址
		String basePath = WebUtil.getDomainUrl(request);
		//支付类型,必填，不能修改
		String payment_type = "1";
		//支付宝，合作身份者ID，以2088开头由16位纯数字组成的字符串
		String alipayPartner = RedisDataReadUtil.getSysConfig("alipay_app_partner");
		// 收款支付宝账号，以2088开头由16位纯数字组成的字符串，一般情况下收款账号就是签约账号
		String seller_id = alipayPartner;
		//支付宝接，口名称
		String alipayService = "create_direct_pay_by_user";
		//支付宝，字符编码格式 目前支持 gbk 或 utf-8
		String alipayInputCharset = RedisDataReadUtil.getSysConfig("alipay_app_input_charset");
		//服务器异步通知页面路径,需http://格式的完整路径，不能加?id=123这类自定义参数
		String notify_url = basePath+"alipay/notifyUrlAlipay.sjson";//回调地址

		//页面跳转同步通知页面路径,需http://格式的完整路径，不能加?id=123这类自定义参数，不能写成http://localhost/
		String return_url = basePath+"alipay/toPaySuccessAlipay.sjson";//回调地址

		//卖家支付宝帐户,必填
		String seller_email = RedisDataReadUtil.getSysConfig("alipay_app_seller_id");
        /*List<BasicKeybook> seller_emailList = RedisDataReadUtil.getBasicKeyBook("alipayEmail");
        if(seller_emailList!=null&&seller_emailList.size()!=0){
            seller_email = seller_emailList.get(0).getValue();
        }*/

		//商户订单号,商户网站订单系统中唯一订单号，必填
		/*String out_trade_no = new String(WIDout_trade_no.getBytes("ISO-8859-1"),"UTF-8");
		//订单描述,存放子订单号集合
		String body = new String(WIDbody.getBytes("ISO-8859-1"),"UTF-8");*/

		//订单名称,必填
		String subject = "您从SHOPJSP充值,订单号为："+out_trade_no;
		//订单集合
		/*List<ShopOrders> ordersList=null;
		//查询订单，未付款，总订单号，子订单号集合
		ordersList = iShopOrdersService.queryShopOrderByAlipay(out_trade_no,body);*/
		//保留两位小数
		finalPrice = finalPrice.setScale(2, BigDecimal.ROUND_HALF_UP);
		//付款金额,必填
		String price = finalPrice.toString();

		//商品数量,必填，建议默认为1，不改变值，把一次交易看成是一次下订单而非购买一件商品
		String quantity = "1";

		//物流费用,必填，即运费
		String logistics_fee = "0.00";

		//物流类型,必填，三个值可选：EXPRESS（快递）、POST（平邮）、EMS（EMS）
		String logistics_type = "EXPRESS";

		//物流支付方式,必填，两个值可选：SELLER_PAY（卖家承担运费）、BUYER_PAY（买家承担运费）
		String logistics_payment = "SELLER_PAY";
		//签名类型
		String sign_type = RedisDataReadUtil.getSysConfig("alipay_app_sign_type");

		//商品展示地址,需以http://开头的完整路径，如：http://www.xxx.com/myorder.html
		//String show_url = new String(request.getParameter("WIDshow_url").getBytes("ISO-8859-1"),"UTF-8");
		//把请求参数打包成数组
		Map<String, String> sParaTemp = new HashMap<String, String>();
		sParaTemp.put("service", alipayService);//trade_create_by_buyer标准双接口  create_partner_trade_by_buyer担保交易
		sParaTemp.put("partner", alipayPartner);//支付宝，合作身份者ID
		sParaTemp.put("seller_id", seller_id);//收款支付宝账号
		sParaTemp.put("_input_charset", alipayInputCharset);//支付宝，字符编码格式 目前支持 gbk 或 utf-8
		sParaTemp.put("payment_type", payment_type);//支付类型
		sParaTemp.put("notify_url", notify_url);//服务器异步通知页面路径
		sParaTemp.put("return_url", return_url);//页面跳转同步通知页面路径
		sParaTemp.put("seller_email", seller_email);//卖家支付宝帐户,必填
		sParaTemp.put("out_trade_no", out_trade_no);//商户订单号,商户网站订单系统中唯一订单号，必填
		sParaTemp.put("subject", subject);//商品名称
		sParaTemp.put("price", price);//付款金额,必填
		sParaTemp.put("quantity", quantity);//商品数量
		sParaTemp.put("logistics_fee", logistics_fee);//物流费用
		sParaTemp.put("logistics_type", logistics_type);//物流类型
		sParaTemp.put("logistics_payment", logistics_payment);//物流支付方式
		sParaTemp.put("body", body);//订单描述,存放子订单号集合
		sParaTemp.put("sign_type",sign_type) ;//签名类型
        /*sParaTemp.put("anti_phishing_key", AlipaySubmit.query_timestamp());
        sParaTemp.put("exter_invoke_ip", AlipayConfig.exter_invoke_ip);*/
		if(payMode != null){
			if(payMode == 4){
				sParaTemp.put("paymethod","bankPay");
				sParaTemp.put("defaultbank", bankCode);
			}
		}
		if(Utils.objectIsNotEmpty(receive_mobile)){
			sParaTemp.put("receive_mobile", receive_mobile);//收货人手机号
		}
		//建立请求
		String sHtmlText = AlipaySubmit.buildRequest(sParaTemp,"get","确认");

/********************以下是将请求数据发向支付宝***********************/
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out;
		out = response.getWriter();
		if(Utils.objectIsNotEmpty(out_trade_no)&&Utils.objectIsNotEmpty(body)){
			out.write(String.valueOf(sHtmlText));
		}else{
			out.write("支付失败！");
		}
		out.flush();
		out.close();
	}

	/**
	 * 商家充值调用支付宝接口
	 * @param out_trade_no
	 * @param body
	 * @param finalPrice
	 * @param payMode
	 * @param bankCode
	 * @param receive_mobile
	 * @param request
	 * @param response
	 * @throws Exception
	 */
	public static void storeRechargeAlipay(String out_trade_no,String body,BigDecimal finalPrice,Integer payMode,String bankCode,String receive_mobile,HttpServletRequest request,HttpServletResponse response) throws Exception{
		//取得本网站地址
		String basePath = WebUtil.getDomainUrl(request);
		//支付类型,必填，不能修改
		String payment_type = "1";
		//支付宝，合作身份者ID，以2088开头由16位纯数字组成的字符串
		String alipayPartner = RedisDataReadUtil.getSysConfig("alipay_app_partner");
		// 收款支付宝账号，以2088开头由16位纯数字组成的字符串，一般情况下收款账号就是签约账号
		String seller_id = alipayPartner;
		//支付宝接，口名称
		String alipayService = "create_direct_pay_by_user";
		//支付宝，字符编码格式 目前支持 gbk 或 utf-8
		String alipayInputCharset = RedisDataReadUtil.getSysConfig("alipay_app_input_charset");
		//服务器异步通知页面路径,需http://格式的完整路径，不能加?id=123这类自定义参数
		String notify_url = basePath+"alipay/notifyUrlAlipay.sjson";//回调地址

		//页面跳转同步通知页面路径,需http://格式的完整路径，不能加?id=123这类自定义参数，不能写成http://localhost/
		String return_url = basePath+"store/funding/toPaySuccessAlipay.sjson";//回调地址

		//卖家支付宝帐户,必填
		String seller_email = RedisDataReadUtil.getSysConfig("alipay_app_seller_id");
        /*List<BasicKeybook> seller_emailList = RedisDataReadUtil.getBasicKeyBook("alipayEmail");
        if(seller_emailList!=null&&seller_emailList.size()!=0){
            seller_email = seller_emailList.get(0).getValue();
        }*/

		//商户订单号,商户网站订单系统中唯一订单号，必填
		/*String out_trade_no = new String(WIDout_trade_no.getBytes("ISO-8859-1"),"UTF-8");
		//订单描述,存放子订单号集合
		String body = new String(WIDbody.getBytes("ISO-8859-1"),"UTF-8");*/

		//订单名称,必填
		String subject = "您从SHOPJSP充值,订单号为："+out_trade_no;
		//订单集合
		/*List<ShopOrders> ordersList=null;
		//查询订单，未付款，总订单号，子订单号集合
		ordersList = iShopOrdersService.queryShopOrderByAlipay(out_trade_no,body);*/
		//保留两位小数
		finalPrice = finalPrice.setScale(2, BigDecimal.ROUND_HALF_UP);
		//付款金额,必填
		String price = finalPrice.toString();

		//商品数量,必填，建议默认为1，不改变值，把一次交易看成是一次下订单而非购买一件商品
		String quantity = "1";

		//物流费用,必填，即运费
		String logistics_fee = "0.00";

		//物流类型,必填，三个值可选：EXPRESS（快递）、POST（平邮）、EMS（EMS）
		String logistics_type = "EXPRESS";

		//物流支付方式,必填，两个值可选：SELLER_PAY（卖家承担运费）、BUYER_PAY（买家承担运费）
		String logistics_payment = "SELLER_PAY";
		//签名类型
		String sign_type = RedisDataReadUtil.getSysConfig("alipay_app_sign_type");

		//商品展示地址,需以http://开头的完整路径，如：http://www.xxx.com/myorder.html
		//String show_url = new String(request.getParameter("WIDshow_url").getBytes("ISO-8859-1"),"UTF-8");
		//把请求参数打包成数组
		Map<String, String> sParaTemp = new HashMap<String, String>();
		sParaTemp.put("service", alipayService);//trade_create_by_buyer标准双接口  create_partner_trade_by_buyer担保交易
		sParaTemp.put("partner", alipayPartner);//支付宝，合作身份者ID
		sParaTemp.put("seller_id", seller_id);//收款支付宝账号
		sParaTemp.put("_input_charset", alipayInputCharset);//支付宝，字符编码格式 目前支持 gbk 或 utf-8
		sParaTemp.put("payment_type", payment_type);//支付类型
		sParaTemp.put("notify_url", notify_url);//服务器异步通知页面路径
		sParaTemp.put("return_url", return_url);//页面跳转同步通知页面路径
		sParaTemp.put("seller_email", seller_email);//卖家支付宝帐户,必填
		sParaTemp.put("out_trade_no", out_trade_no);//商户订单号,商户网站订单系统中唯一订单号，必填
		sParaTemp.put("subject", subject);//商品名称
		sParaTemp.put("price", price);//付款金额,必填
		sParaTemp.put("quantity", quantity);//商品数量
		sParaTemp.put("logistics_fee", logistics_fee);//物流费用
		sParaTemp.put("logistics_type", logistics_type);//物流类型
		sParaTemp.put("logistics_payment", logistics_payment);//物流支付方式
		sParaTemp.put("body", body);//订单描述,存放子订单号集合
		sParaTemp.put("sign_type",sign_type) ;//签名类型
        /*sParaTemp.put("anti_phishing_key", AlipaySubmit.query_timestamp());
        sParaTemp.put("exter_invoke_ip", AlipayConfig.exter_invoke_ip);*/
		if(payMode != null){
			if(payMode == 4){
				sParaTemp.put("paymethod","bankPay");
				sParaTemp.put("defaultbank", bankCode);
			}
		}
		if(Utils.objectIsNotEmpty(receive_mobile)){
			sParaTemp.put("receive_mobile", receive_mobile);//收货人手机号
		}
		//建立请求
		String sHtmlText = AlipaySubmit.buildRequest(sParaTemp,"get","确认");

/********************以下是将请求数据发向支付宝***********************/
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out;
		out = response.getWriter();
		if(Utils.objectIsNotEmpty(out_trade_no)&&Utils.objectIsNotEmpty(body)){
			out.write(String.valueOf(sHtmlText));
		}else{
			out.write("支付失败！");
		}
		out.flush();
		out.close();
	}
}
